import router from '@/routers/index'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { useUserStore } from '@/store/modules/user'
import { usePermissionStore } from '@/store/modules/permission'

NProgress.configure({ showSpinner: false }) // NProgress Configuration

const whiteList = ['/login', '/auth-redirect'] // 设置白名单
// 记录路由是否已经添加
let isAddAsyncRoutes = false

router.beforeEach(async (to, from, next) => {
  // 开启进度条
  NProgress.start()
  // 设置标题
  if (typeof to.meta.title === 'string') {
    document.title = to.meta.title || '成理工程学科竞赛管理系统'
  }
  const userStore = useUserStore()
  if (userStore.token) {
    if (to.path === '/login') {
      // 如果已登录，请重定向到主页
      next({ path: '/' })
      NProgress.done()
    } else {
      try {
        const PermissionStore = usePermissionStore()
        // 检查是否已经添加过动态路由
        if (!isAddAsyncRoutes) {
          // 确保用户信息存在
          if (!userStore.userInfo || !userStore.userInfo.roles) {
            // 如果用户信息不存在，先获取用户信息
            console.log('获取用户信息============执行了这个函数')
            await userStore.getUserInfo()
          }
          // 获取权限列表并生成路由
          const accessRoutes = await PermissionStore.generateRoutes(userStore.userInfo.roles)
          // 动态添加路由
          accessRoutes.forEach((route) => {
            router.addRoute(route)
          })
          // 标记路由已添加
          isAddAsyncRoutes = true
          // 确保路由添加完成后再跳转，使用 replace: true 避免历史记录堆积
          next({ ...to, replace: true })
        } else {
          // 路由已添加，检查当前路由是否有权限访问
          const hasPermission = router.hasRoute(to.name as string)
          if (hasPermission) {
            next()
          } else {
            // 没有权限访问该路由，跳转到首页或403页面
            next({ path: '/403' })
          }
        }
      } catch (error) {
        console.error('路由权限检查失败:', error)
        // 清除状态，重新登录
        userStore.logout()
        isAddAsyncRoutes = false
        next('/login')
      }
    }
  } else {
    // 未登录状态，重置路由添加标记
    isAddAsyncRoutes = false

    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next('/login')
    }
  }
})

router.afterEach(() => {
  NProgress.done()
})
